package com.cskaoyan.javase.oop1._14block._2building._2sumup;

/**
 * 总结一下到目前为止，创建对象过程中可能碰到的结构的执行顺序：
 * new对象过程中，各种结构的执行顺序：
 *
 * 对象结构存在后就进行默认初始化，所有成员变量都具有默认值后，再开始其余赋值操作
 * 找到new对象的那个构造器
 *
 * 如果它的首行显式地调用了另一个构造器
 *   （注：显式调用构造器目前指的是this调用自身构造器，其它场景这里先不考虑，比如super，因为你没学）
 *
 * 那么程序会先跳转到那个构造器，但是不会立刻执行，而是：
 *
 * 按照类中构造代码块和显式赋值的代码书写顺序，从上到下执行其中的代码，执行完毕后：
 * 跳转回this语句要指示执行的构造器，执行其中的代码，然后：
 * 跳转回new对象构造器，执行完毕后，创建对象结束。
 * 注：整个过程中，构造代码块和显式赋值的代码只会执行一次，不会执行多次！！
 *
 * 如果它的首行没有显式调用另一个构造器
 * 那么会先从上到下执行构造代码块和显式赋值代码，执行完毕后：
 *
 * 跳转回new对象构造器，执行完毕后，创建对象结束。
 *
 * 注：整个过程中，构造代码块和显式赋值的代码只会执行一次，不会执行多次！！
 *
 * 以上总结，没有引入继承的概念，并不全面，我们会在继承中补全它。
 * @since 15:47
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        Student s = new Student(38, "麻子");
        System.out.println(s.age);
        System.out.println(s.name);
    }
}

class Student {
    {
        age = 28;
        System.out.println("66666");
    }

    int age = 18;
    String name = "张三";

    {
        name = "李四";
        System.out.println("hello world!");
    }

    public Student() {
    }

    public Student(String name) {
        this.name = name;
        System.out.println("Student name");
    }

    public Student(int age, String name) {
        this(name);
        System.out.println("Student age name");
        this.age = age;
    }
}
